package main

import (
	"area_search/handlers"
	"area_search/middlewares"
	"fmt"
	"log"
	"os"

	"github.com/gin-gonic/gin"
	"github.com/spf13/viper"
)

/*
代码说明
initConfig 函数：
初始化 Viper 配置，设置配置文件名、路径和类型。
读取配置文件，如果文件不存在或读取失败，会触发错误。
设置默认值，确保即使配置文件中没有某些字段，程序也能正常运行。
saveConfig 函数：
将当前配置保存到配置文件中。
可以用于动态修改配置并保存。
配置文件格式：
使用 YAML 格式（推荐），也可以使用 JSON 或 TOML。
配置文件支持嵌套结构，例如 server.port。
动态修改配置：
可以通过 viper.Set("key", value) 动态修改配置。
修改后调用 saveConfig 保存到文件。
*/
// 初始化 Viper 配置
func initConfig() {
	// 设置配置文件名（不需要扩展名）
	viper.SetConfigName("config")
	// 设置配置文件路径（当前目录）
	viper.AddConfigPath("./backend")
	// 设置配置文件类型（例如：yaml、json、toml 等）
	viper.SetConfigType("yaml")

	// 读取配置文件
	if err := viper.ReadInConfig(); err != nil {
		log.Fatalf("无法读取配置文件: %v", err)
	}

	// 设置默认值（如果配置文件中没有对应字段）
	viper.SetDefault("server.port", "8087")
	viper.SetDefault("server.host", "localhost")
	viper.SetDefault("vos.passwd", "123456")
	viper.SetDefault("vos.port", "1202")
}

// 保存配置到文件
func saveConfig() {
	if err := viper.WriteConfig(); err != nil {
		log.Printf("保存配置文件失败: %v", err)
	}
}

func main() {
	// 初始化配置
	initConfig()

	// 创建 Gin 实例
	r := gin.Default()
	gin.SetMode(gin.ReleaseMode)

	r.Use(middlewares.CORS())

	// 设置路由
	api := r.Group("/api")
	{
		api.POST("/auth", handlers.LoginHandler)
		api.GET("/system", handlers.SystemHandler)
		api.POST("/report", handlers.GetVOSPort)
		api.POST("/vos", handlers.VOSHandler)
		api.GET("/ip", handlers.GetIPHandler)
		api.POST("/ip", handlers.AddIPHandler)
		api.DELETE("/ip/:id", handlers.DeleteIPHandler)
		api.POST("/blind", handlers.BlindAreaHandler)
		api.GET("/vos/identifier", handlers.GetVOSIdentifier)
	}
	// 设置静态文件服务
	// 假设编译后的 Vue 应用程序位于 ./web/dist 目录下
	staticDir := "./web/dist"
	if _, err := os.Stat(staticDir); os.IsNotExist(err) {
		log.Fatalf("静态文件目录不存在: %s", staticDir)
	}
	// 静态文件服务
	r.Static("/assets", fmt.Sprintf("%s/assets", staticDir))           // 处理 /assets 路径
	r.StaticFile("/vite.svg", fmt.Sprintf("%s/vite.svg", staticDir))   // 处理 favicon.ico
	r.StaticFile("/README.md", fmt.Sprintf("%s/README.md", staticDir)) // 处理 README.md
	// 设置默认路由，用于前端单页应用（SPA）的路由
	r.NoRoute(func(c *gin.Context) {
		c.File(fmt.Sprintf("%s/index.html", staticDir))
	})
	// 从配置文件中读取服务器端口
	port := viper.GetString("server.port")
	host := viper.GetString("server.host")

	// 启动服务器
	addr := fmt.Sprintf("%s:%s", host, port)
	log.Printf("服务器启动，监听地址: %s", addr)
	if err := r.Run(addr); err != nil {
		log.Fatalf("服务器启动失败: %v", err)
	}
}
